/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Evenement;
import com.rhf.core.dto.EvenementVO;

/**
 * @author fabiensaulnier
 * 
 */
public class EvenementImp extends Base implements Evenement {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Evenement#contructeur(java.sql.ResultSet)
	 */
	public EvenementVO contructeur(ResultSet rs) throws Exception {

		EvenementVO evenementVO = new EvenementVO();

		try {

			evenementVO.setEvenementId(rs.getInt("evenement_id"));
			evenementVO.setDateCreation(rs.getTimestamp("date_creation"));
			evenementVO.setDateModification(rs.getTimestamp("date_modification"));
			evenementVO.setAuteurId(rs.getInt("auteur_id"));
			evenementVO.setCompetitionId(rs.getInt("competition_id"));
			evenementVO.setLibelle(rs.getString("libelle"));
			evenementVO.setLieu(rs.getString("lieu"));
			evenementVO.setEvenementParentId(rs.getInt("evenement_parent_id"));
			evenementVO.setOrdre(rs.getInt("ordre"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return evenementVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Evenement#ajouterEvenement(com.rhf.core.db
	 * .valuesobjects .EvenementVO)
	 */
	public int ajouterEvenement(EvenementVO evenementVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO evenement ";
		query += "(auteur_id, competition_id, libelle, lieu, evenement_parent_id, ordre) ";
		query += "VALUES (?, ?, ?, ?, ?, ?)";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, evenementVO.getAuteurId());
			stmt.setInt(i++, evenementVO.getCompetitionId());
			stmt.setString(i++, evenementVO.getLibelle());
			stmt.setString(i++, evenementVO.getLieu());
			stmt.setInt(i++, evenementVO.getEvenementParentId());
			stmt.setInt(i++, evenementVO.getOrdre());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Evenement#modifierEvenement(com.rhf.core.db
	 * .valuesobjects .EvenementVO)
	 */
	public int modifierEvenement(EvenementVO evenementVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE evenement ";
		query += "SET date_modification = now(), auteur_id = ?, competition_id = ?, libelle = ?, lieu = ?, evenement_parent_id = ?, ordre = ?) ";
		query += "WHERE evenement_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, evenementVO.getAuteurId());
			stmt.setInt(i++, evenementVO.getCompetitionId());
			stmt.setString(i++, evenementVO.getLibelle());
			stmt.setString(i++, evenementVO.getLieu());
			stmt.setInt(i++, evenementVO.getEvenementParentId());
			stmt.setInt(i++, evenementVO.getOrdre());
			stmt.setInt(i++, evenementVO.getEvenementId());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Evenement#recupererListeEvenementParCompetition
	 * (int)
	 */
	public List<EvenementVO> recupererListeEvenementParCompetition(int competitionId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<EvenementVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM evenement WHERE competition_id ? ";
		query += "ORDER BY ordre, libelle";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, competitionId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<EvenementVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Evenement#supprimerEvenement(int)
	 */
	public int supprimerEvenement(int evenementId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM evenement ";
		query += "WHERE evenement_id = ? ";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, evenementId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
